package com.loeng.module.system.service.socail;

import cn.hutool.core.util.ObjUtil;
import com.loeng.framework.common.pojo.PageResult;
import com.loeng.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
import com.loeng.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
import com.loeng.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
import com.loeng.module.system.convert.social.SocialClientConvert;
import com.loeng.module.system.dal.dataobject.social.SocialClientDO;
import com.loeng.module.system.dal.mysql.social.SocialClientMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import static com.loeng.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.loeng.module.system.enums.ErrorCodeConstants.SOCIAL_CLIENT_NOT_EXISTS;
import static com.loeng.module.system.enums.ErrorCodeConstants.SOCIAL_CLIENT_UNIQUE;

/**
 * 社交应用 Service 实现类
 * @author loeng
 * @date 2025/5/18 17:04
 */
@Service
@Slf4j
public class SocialClientServiceImpl implements SocialClientService {

    @Resource
    private SocialClientMapper socialClientMapper;

    /**
     * 创建社交客户端
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    @Override
    public Long createSocialClient(SocialClientCreateReqVO createReqVO) {
        // 校验重复
        validateSocialClientUnique(null, createReqVO.getUserType(), createReqVO.getSocialType());

        // 插入
        SocialClientDO socialClientDO = SocialClientConvert.INSTANCE.convert(createReqVO);
        socialClientMapper.insert(socialClientDO);
        return socialClientDO.getId();
    }

    /**
     * 更新社交客户端
     *
     * @param updateReqVO 更新信息
     */
    @Override
    public void updateSocialClient(SocialClientUpdateReqVO updateReqVO) {
        // 校验存在
        validateSocialClientExists(updateReqVO.getId());
        // 校验重复
        validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getUserType(), updateReqVO.getSocialType());

        // 更新
        SocialClientDO updateObj = SocialClientConvert.INSTANCE.convert(updateReqVO);
        socialClientMapper.updateById(updateObj);
    }

    /**
     * 删除社交客户端
     *
     * @param id 编号
     */
    @Override
    public void deleteSocialClient(Long id) {
        // 校验存在
        validateSocialClientExists(id);
        // 删除
        socialClientMapper.deleteById(id);
    }

    /**
     * 获得社交客户端
     *
     * @param id 编号
     * @return 社交客户端
     */
    @Override
    public SocialClientDO getSocialClient(Long id) {
        return socialClientMapper.selectById(id);
    }

    /**
     * 获得社交客户端分页
     *
     * @param pageVO 分页参数
     * @return 社交客户端分页
     */
    @Override
    public PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageVO) {
        return socialClientMapper.selectPage(pageVO);
    }

    /**
     * 校验社交客户端是否重复
     *
     * @param id 编号
     */
    private void validateSocialClientExists(Long id) {
        if (socialClientMapper.selectById(id) == null) {
            throw exception(SOCIAL_CLIENT_NOT_EXISTS);
        }
    }

    /**
     * 校验社交客户端是否重复
     *
     * @param id        编号
     * @param userType  用户类型
     * @param socialType 社交平台的类型
     */
    private void validateSocialClientUnique(Long id, Integer userType, Integer socialType) {
        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(socialType, userType);
        if (client == null) {
            return;
        }
        // 新增时，说明重复  更新时，如果 id 不一致，说明重复
        if (id == null  || ObjUtil.notEqual(id, client.getId())) {
            throw exception(SOCIAL_CLIENT_UNIQUE);
        }
    }

}
